aboutsummaryrefslogtreecommitdiffstats
path: root/src/pages/blog/[...page].astro
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/blog/[...page].astro')
-rw-r--r--src/pages/blog/[...page].astro58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro
new file mode 100644
index 0000000..eb196db
--- /dev/null
+++ b/src/pages/blog/[...page].astro
@@ -0,0 +1,58 @@
+---
+import BlogCard from '@/components/BlogCard.astro'
+import Breadcrumbs from '@/components/Breadcrumbs.astro'
+import PageHead from '@/components/PageHead.astro'
+import PaginationComponent from '@/components/ui/pagination'
+import { SITE } from '@/consts'
+import Layout from '@/layouts/Layout.astro'
+import { getAllPosts, groupPostsByYear } from '@/lib/data-utils'
+import type { PaginateFunction } from 'astro'
+
+export async function getStaticPaths({
+ paginate,
+}: {
+ paginate: PaginateFunction
+}) {
+ const allPosts = await getAllPosts()
+ return paginate(allPosts, { pageSize: SITE.postsPerPage })
+}
+
+const { page } = Astro.props
+
+const postsByYear = groupPostsByYear(page.data)
+const years = Object.keys(postsByYear).sort((a, b) => parseInt(b) - parseInt(a))
+---
+
+<Layout class="max-w-3xl">
+ <PageHead slot="head" title="Blog" />
+ <Breadcrumbs
+ items={[
+ { label: 'Blog', href: '/blog', icon: 'lucide:library-big' },
+ { label: `Page ${page.currentPage}`, icon: 'lucide:book-copy' },
+ ]}
+ />
+
+ <div class="flex min-h-[calc(100vh-18rem)] flex-col gap-y-8">
+ {
+ years.map((year) => (
+ <section class="flex flex-col gap-y-4">
+ <div class="font-medium">{year}</div>
+ <ul class="flex flex-col gap-4">
+ {postsByYear[year].map((post) => (
+ <li>
+ <BlogCard entry={post} />
+ </li>
+ ))}
+ </ul>
+ </section>
+ ))
+ }
+ </div>
+
+ <PaginationComponent
+ currentPage={page.currentPage}
+ totalPages={page.lastPage}
+ baseUrl="/blog/"
+ client:load
+ />
+</Layout>